package cn.sytton.taffecloud.common.model.base;

import cn.sytton.taffecloud.common.base.annotation.NewId;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.util.UUID;

/**
 * 所有业务实体类的基类
 *
 * @author skyrock
 */
@Slf4j
public class BaseEntity{

    public BaseEntity(){
        Field[] fields = this.getClass().getDeclaredFields();
        for (Field field : fields) {
            boolean fieldNewId = field.isAnnotationPresent(NewId.class);
            if (fieldNewId) {
                field.setAccessible(true);
                try {
                    field.set(this, UUID.randomUUID().toString());
                } catch (IllegalAccessException e) {
                    log.error(e.getMessage(), e);
                }

            }
        }
    }

	public String toString() {
        try {
            return new ObjectMapper().writeValueAsString(this);
        } catch (JsonProcessingException e) {
            return "{}";
        }
    }

    /**
     * 重写equals()必须遵循的准则：
     * • 对称性：如果x.equals(y)返回是“true”，那么y.equals(x)也应该返回是“true”。
     * • 反射性：x.equals(x)必须返回是“true”。
     * • 类推性：如果x.equals(y)返回是“true”，而且y.equals(z)返回是“true”，那么z.equals(x)也应该返回是“true”。
     * • 还有一致性：如果x.equals(y)返回是“true”，只要x和y内容一直不变，不管你重复x.equals(y)多少次，返回都是“true”。
     * • 任何情况下，x.equals(null)，永远返回是“false”；x.equals(和x不同类型的对象)永远返回是“false”。
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null) return false;
        if (obj.getClass() != this.getClass()) return false;

        return this.toString().equals(obj.toString());
    }

}
